from app01 import models
from django import forms
import re
from app01.utils.bootstrap import BootStrapModelFrom


class PrettyEditModelForm(forms.ModelForm):
    """用于编辑"""
    # 显示但不能修改【重写定义不能修改
    mobile = forms.CharField(disabled=True, label="手机号")

    class Meta:
        model = models.PrettyNum

        # 重写 只能修改 价格 等级 状态【没写的就不会显示在页面 就不能修改
        fields = ['mobile', 'price', 'level', 'status']

    def __init__(self, *args, **kwargs):
        super(PrettyEditModelForm, self).__init__(*args, **kwargs)

        # 循环所有的字段,找到所有在加上属性 "class": "form-control"
        # name是想拿到的名字 field是相对应的对象
        for name, field in self.fields.items():
            field.widget.attrs = {"class": "form-control", "placeholder": field.label}

    def clean_mobile(self):
        """
            检验函数
            编辑是手机号要排除自己以外，其他的数据是否和编辑后的手机号重复
        """
        # 当前编辑的哪一行的id
        ex_id = self.instance.pk

        # 拿到用户输入的手机号
        txt_mobile = self.cleaned_data['mobile']
        # 从数据库中查询添加的手机号是否错在（T/F） exists() 判断是否存在
        exists = models.PrettyNum.objects.exclude(id=ex_id).filter(mobile=txt_mobile).exists()
        if exists:
            raise forms.ValidationError('手机号已存在')

        mobile_regex = r'^1[34578]\d{9}$'
        p = re.compile(mobile_regex)
        if p.match(txt_mobile):
            return txt_mobile
        else:
            raise forms.ValidationError('手机号码非法', code='invalid mobile')


class PrettyModelForm(BootStrapModelFrom):
    """用户添加"""

    # 方式一：验证手机号是否合格【 字段+正则
    # mobile = forms.CharField(
    #     label="手机号",
    #     validators=[RegexValidator(r'^1[34578]\d{9}$'), '手机号格式错误'],
    # )

    class Meta:
        model = models.PrettyNum
        # 数据表中的字段【自定义
        fields = ['mobile', 'price', 'level', 'status']
        # fields = "__all__"  # 表示数据表中的所有字段
        # exclude = ['level']     # 排除那个字段【其他的都在

    # 有了bootstrap的继承
    # def __init__(self, *args, **kwargs):
    #     super(PrettyModelForm, self).__init__(*args, **kwargs)
    #
    #     # 循环所有的字段,找到所有在加上属性 "class": "form-control"
    #     # name是想拿到的名字 field是相对应的对象
    #     for name, field in self.fields.items():
    #         field.widget.attrs = {"class": "form-control", "placeholder": field.label}

    # 验证方式二【构造方法    【钩子方法
    def clean_mobile(self):
        # # 获取用户输入的mobile
        # txt_mobile = self.cleaned_data('mobile')
        # if len(txt_mobile) != 11:
        #     # 验证不通过，抛出
        #     raise ValidationError('格式错误')
        # # 验证通过，把用户输入的值返回
        # return txt_mobile
        # 拿到用户输入的手机号
        txt_mobile = self.cleaned_data['mobile']
        # 从数据库中查询添加的手机号是否错在（T/F） exists() 判断是否存在
        exists = models.PrettyNum.objects.filter(mobile=txt_mobile).exists()

        if exists:
            raise forms.ValidationError('手机号已存在')

        mobile_regex = r'^1[34578]\d{9}$'
        p = re.compile(mobile_regex)
        if p.match(txt_mobile):
            return txt_mobile
        else:
            raise forms.ValidationError('手机号码非法', code='invalid mobile')


class UserModelFrom(BootStrapModelFrom):
    # name = forms.CharField() # 数据类型重写

    class Meta:
        model = models.UserInfo
        fields = ['name', 'password', 'age', 'account', 'create_time', 'gender', 'depart']
        # fields = ['name', 'password', 'age' ]

        # 样式【定义插件设置样式
        widgets = {
            # "name": forms.TextInput(attrs={'class': "form-control"}),
            "password": forms.PasswordInput(attrs={'class': "form-control"}),
            # "age": forms.TextInput(attrs={'class': "form-control"}),
            # "account": forms.TextInput(attrs={'class': "form-control"}),
            "create_time": forms.TextInput(attrs={'class': "form-control", "type": "date"}),
            # "gender": forms.TextInput(attrs={'class': "form-control"}),
            # "depart": forms.TextInput(attrs={'class': "form-control"})
        }

    # 有了bootstrap类的继承
    # def __init__(self, *args, **kwargs):
    #     super(UserModelFrom, self).__init__(*args, **kwargs)
    #
    #     # 循环ModelFrom所有的字段,找到所有在加上属性 "class": "form-control"
    #     # name是想拿到的名字 field是相对应的对象
    #     for name, field in self.fields.items():
    #         # 这里是强行修改所有属性 应该要保留原来字段的属性 没有属性在增减属性
    #         field.widget.attrs = {
    #             "class": "form-control",
    #             "placeholder": field.label}